package com.gz.servlet;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class HiServlet implements Servlet {

    @Override
    /**
     * 1.初始化 servlet
     * 2.当创建HelloServlet实例时，会调用init方法
     * 3.该方法只会被调用一次
     */
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init()被调用");
    }

    @Override
    /**
     * 返回ServletConfig 也就是返回Servlet的配置
     */
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    /**
     * 重要:
     * 1.service方法处理浏览器的请求(包括get/post)
     * 2.当浏览器每次请求Servlet时，就会调用一次service
     * 3.当tomcat调用该方法时，会把http请求的数据封装成实现ServletRequest接口的request对象
     * 4.通过servletRequest 对象，可以得到用户提交的数据
     * 5.servletResponse 对象可以用于返回数据给tomcat->浏览器
     *
     * Servlet是单例的，常驻内存，即每次调用不会重新创建对象
     * 可以用一个private int count=0;放在service()中测试，发现没刷新一次count就会累加一次，而不是每次变为0
     * 如果要动态创建，即每次调用新创建一个对象的话，在后面的知识
     */
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("hi,Servlet");

        //Tomcat每处理一次请求，就生成一个新的线程
        System.out.println("当前线程id: "+Thread.currentThread().getId());

        //从servletRequest对象获取请求方式
        //servletRequest的子接口有相关方法 (ctrl+alt+b 查看子接口,用的很多，要记住)
        //把servletRequest转成HttpServletRequest(子接口，向下转型)引用
        HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
        String method = httpServletRequest.getMethod();
        //http://localhost:8080/servlet/register.html
        if("GET".equals(method)){
            doGet();//处理GET请求
        }
        else if("POST".equals(method)){
            doPost();//处理POST请求
        }

    }
    public void doGet(){
        System.out.println("doGet() 被调用");
    }
    public void doPost(){
        System.out.println("doPost() 被调用");
    }

    @Override
    /**
     * 返回servlet信息，使用较少
     */
    public String getServletInfo() {
        return "";
    }

    @Override
    /**
     * 1.该方法在servlet销毁时调用
     * 2.只调用一次
     */
    public void destroy() {

    }
}